﻿(function () {
    'use strict';

    // 检查是否是有效的 VBA 代码
    function isVBACode(code) {
        // 去除注释
        code = code.replace(/'.*$/gm, '');
        // 匹配 Sub 或 Function 块
        const pattern = /^\s*(Sub|Function)\b[\s\S]*?(End (Sub|Function))\s*$/i;
        return pattern.test(code);
    }

    // 添加“运行”和“收藏”按钮的函数
    function addButtons() {
        // 查找所有代码块的头部
        const codeHeaders = document.querySelectorAll('.segment-code-header');

        codeHeaders.forEach(header => {
            // 检查是否已经添加了“运行”按钮
            if (header.querySelector('.segment-code-run')) {
                return; // 如果已经添加了按钮，跳过
            }

            // 创建“运行”按钮
            const runButton = document.createElement('span');
            runButton.textContent = '▶️运行';
            runButton.classList.add('segment-code-run');
            runButton.style.marginRight = '10px';
            runButton.style.cursor = 'pointer';
            runButton.style.color = '#007bff';

            // 创建“收藏”按钮
            const favoriteButton = document.createElement('span');
            favoriteButton.textContent = '❤️收藏';
            favoriteButton.classList.add('segment-code-favorite');
            favoriteButton.style.marginRight = '10px';
            favoriteButton.style.cursor = 'pointer';
            favoriteButton.style.color = '#007bff';

            // 添加“运行”按钮点击事件
            runButton.addEventListener('click', function () {
                // 查找VBA代码容器
                const codeContainer = header.parentElement.querySelector('code.language-vba');
                if (codeContainer) {
                    // 提取VBA代码
                    const vbaCode = codeContainer.innerText;
                    console.log(vbaCode);

                    // 检查是否是VBA代码
                    if (isVBACode(vbaCode)) {
                        // 将 VBA 代码进行 URL 编码
                        const encodedCode = encodeURIComponent(vbaCode);

                        // 将 VBA 代码发送给 C# 后端
                        window.chrome.webview.postMessage({
                            type: 'runVBA',
                            code: encodedCode // 传输编码后的 VBA 代码
                        });
                    } else {
                        alert('提取的代码不是有效的VBA代码！');
                    }
                } else {
                    alert('未找到VBA代码！');
                }
            });

            // 添加“收藏”按钮点击事件
            favoriteButton.addEventListener('click', function () {
                // 查找VBA代码容器
                const codeContainer = header.parentElement.querySelector('code.language-vba');
                if (codeContainer) {
                    // 提取VBA代码
                    const vbaCode = codeContainer.innerText;
                    console.log(vbaCode);

                    // 检查是否是VBA代码
                    if (isVBACode(vbaCode)) {
                        // 将 VBA 代码发送给 C# 后端
                        window.chrome.webview.postMessage({
                            type: 'favoriteVBA',
                            code: vbaCode
                        });
                    } else {
                        alert('这不是有效的VBA代码');
                    }
                } else {
                    alert('未找到VBA代码！');
                }
            });

            // 将“运行”和“收藏”按钮插入到“复制”按钮的左侧
            header.insertBefore(favoriteButton, header.querySelector('.segment-code-copy'));
            header.insertBefore(runButton, header.querySelector('.segment-code-copy'));
        });
    }

    // 添加“导出”按钮的函数
    function addExportButtons() {
        // 查找所有Markdown容器
        const markdownContainers = document.querySelectorAll('.markdown');

        markdownContainers.forEach((container) => {
            // 检查是否已经添加了“导出”按钮
            if (container.querySelector('button')) {
                return; // 如果已经添加了按钮，跳过
            }

            // 创建“导出”按钮
            const exportButton = document.createElement('button');
            exportButton.textContent = '📥导出';
            exportButton.style.marginTop = '10px';
            exportButton.style.padding = '5px 10px';
            exportButton.style.backgroundColor = '#007bff';
            exportButton.style.color = '#fff';
            exportButton.style.border = 'none';
            exportButton.style.borderRadius = '4px';
            exportButton.style.cursor = 'pointer';

            // 添加点击事件
            exportButton.addEventListener('click', function () {
                // 提取当前Markdown容器的文本
                const markdownText = container.innerText;

                // 发送消息到C#后端
                if (window.chrome && window.chrome.webview) {
                    window.chrome.webview.postMessage({ type: 'exportText', text: markdownText });
                } else {
                    console.error('window.chrome.webview is not available.');
                }
            });

            // 将按钮添加到Markdown容器的底部
            container.appendChild(exportButton);
        });
    }

    // 创建上传按钮
    function createUploadButton() {
        const uploadButton = document.createElement('span');
        uploadButton.textContent = '📤';
        uploadButton.classList.add('custom-upload-button');
        uploadButton.style.marginRight = '10px';
        uploadButton.style.cursor = 'pointer';
        uploadButton.style.color = '#007bff';

        uploadButton.addEventListener('click', function () {
            // 发送上传文件请求到 C# 后端
            window.chrome.webview.postMessage({
                type: 'uploadWorkbook'
            });
        });

        return uploadButton;
    }

    // 将上传按钮添加到工具栏
    function addUploadButtonToToolbar() {
        const toolbar = document.querySelector('.right-area');
        if (toolbar && !toolbar.querySelector('.custom-upload-button')) {
            const uploadButton = createUploadButton();
            toolbar.insertBefore(uploadButton, toolbar.firstChild);
        }
    }

    // 自定义上传函数 - 接收来自C#的文件数据并直接上传
    window.directUploadExcelFile = function (fileData, fileName, fileType) {
        try {
            // 查找文件上传控件
            const fileInput = document.querySelector('input[type="file"]');
            if (!fileInput) {
                window.chrome.webview.postMessage({
                    type: 'uploadError',
                    message: '未找到文件上传控件'
                });
                return;
            }

            // 创建包含文件数据的Blob对象
            const blob = base64ToBlob(fileData, fileType);

            // 创建包含文件的DataTransfer对象
            const dt = new DataTransfer();
            const file = new File([blob], fileName, { type: fileType });
            dt.items.add(file);

            // 将DataTransfer对象分配给文件输入元素
            fileInput.files = dt.files;

            // 触发change事件
            const event = new Event('change', { bubbles: true });
            fileInput.dispatchEvent(event);

            // 通知上传成功
            window.chrome.webview.postMessage({
                type: 'uploadStarted',
                fileName: fileName
            });

            // 对于某些网站可能需要自动提交表单
            const form = fileInput.closest('form');
            if (form) {
                // 可选：延迟提交表单
                setTimeout(() => {
                    form.submit();
                }, 500);
            }
        } catch (error) {
            window.chrome.webview.postMessage({
                type: 'uploadError',
                message: '上传过程中出错: ' + error.message
            });
        }
    };

    // Base64字符串转Blob对象
    function base64ToBlob(base64, mimeType) {
        // 解码Base64字符串
        const byteCharacters = atob(base64);
        const byteArrays = [];

        for (let offset = 0; offset < byteCharacters.length; offset += 1024) {
            const slice = byteCharacters.slice(offset, offset + 1024);

            const byteNumbers = new Array(slice.length);
            for (let i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            const byteArray = new Uint8Array(byteNumbers);
            byteArrays.push(byteArray);
        }

        return new Blob(byteArrays, { type: mimeType });
    }

    // 初始化MutationObserver
    function initObserver() {
        const observer = new MutationObserver(function (mutations) {
            mutations.forEach(mutation => {
                if (mutation.type === 'childList') {
                    // 如果DOM发生变化，重新添加按钮
                    addButtons();
                    addExportButtons();
                    addUploadButtonToToolbar();
                }
            });
        });

        // 监听整个文档的变化
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    }

    // 确保在页面加载完成后执行
    if (document.readyState === 'complete' || document.readyState === 'interactive') {
        addButtons();
        addExportButtons();
        addUploadButtonToToolbar();
        initObserver();
    } else {
        window.addEventListener('DOMContentLoaded', function () {
            addButtons();
            addExportButtons();
            addUploadButtonToToolbar();
            initObserver();
        });
    }
})();